sgdk
maths.h
Go to the documentation of this file.
00001 
00011 #ifndef _MATHS_H_
00012 #define _MATHS_H_
00013 
00014 
00015 extern const fix32 sintab32[1024];
00016 extern const fix16 sintab16[1024];
00017 
00018 #if (MATH_BIG_TABLES != 0)
00019 extern const fix16 log2tab16[0x10000];
00020 extern const fix16 log10tab16[0x10000];
00021 extern const fix16 sqrttab16[0x10000];
00022 #endif
00023 
00024 
00029 #define min(X, Y) ((X) < (Y))?(X):(Y)
00030 
00035 #define max(X, Y) ((X) > (Y))?(X):(Y)
00036 
00037 
00038 #ifndef PI
00039 
00043 #define PI 3.14159265358979323846
00044 #endif
00045 
00046 
00047 #define FIX32_INT_BITS              22
00048 #define FIX32_FRAC_BITS             (32 - FIX32_INT_BITS)
00049 
00050 #define FIX32_INT_MASK              (((1 << FIX32_INT_BITS) - 1) << FIX32_FRAC_BITS)
00051 #define FIX32_FRAC_MASK             ((1 << FIX32_FRAC_BITS) - 1)
00052 
00059 #define FIX32(value)                ((fix32) ((value) * (1 << FIX32_FRAC_BITS)))
00060 
00065 #define intToFix32(value)           ((value) << FIX32_FRAC_BITS)
00066 
00070 #define fix32ToInt(value)           ((value) >> FIX32_FRAC_BITS)
00071 
00076 #define fix32Round(value)           \
00077     (fix32Frac(value) > FIX32(0.5))?fix32Int(value + FIX32(1)) + 1:fix32Int(value)
00078 
00083 #define fix32ToRoundedInt(value)    \
00084     (fix32Frac(value) > FIX32(0.5))?fix32ToInt(value) + 1:fix32ToInt(value)
00085 
00090 #define fix32Frac(value)            ((value) & FIX32_FRAC_MASK)
00091 
00095 #define fix32Int(value)             ((value) & FIX32_INT_MASK)
00096 
00101 #define fix32Add(val1, val2)        ((val1) + (val2))
00102 
00106 #define fix32Sub(val1, val2)        ((val1) - (val2))
00107 
00111 #define fix32Neg(value)             (0 - (value))
00112 
00117 #define fix32Mul(val1, val2)        (((val1) * (val2)) >> FIX32_FRAC_BITS)
00118 
00122 #define fix32Div(val1, val2)        (((val1) << FIX32_FRAC_BITS) / (val2))
00123 
00124 
00125 #define FIX16_INT_BITS              10
00126 #define FIX16_FRAC_BITS             (16 - FIX16_INT_BITS)
00127 
00128 #define FIX16_INT_MASK              (((1 << FIX16_INT_BITS) - 1) << FIX16_FRAC_BITS)
00129 #define FIX16_FRAC_MASK             ((1 << FIX16_FRAC_BITS) - 1)
00130 
00137 #define FIX16(value)                ((fix16) ((value) * (1 << FIX16_FRAC_BITS)))
00138 
00143 #define intToFix16(value)           ((value) << FIX16_FRAC_BITS)
00144 
00148 #define fix16ToInt(value)           ((value) >> FIX16_FRAC_BITS)
00149 
00154 #define fix16Round(value)           \
00155     (fix16Frac(value) > FIX16(0.5))?fix16Int(value + FIX16(1)) + 1:fix16Int(value)
00156 
00161 #define fix16ToRoundedInt(value)    \
00162     (fix16Frac(value) > FIX16(0.5))?fix16ToInt(value) + 1:fix16ToInt(value)
00163 
00168 #define fix16Frac(value)            ((value) & FIX16_FRAC_MASK)
00169 
00173 #define fix16Int(value)             ((value) & FIX16_INT_MASK)
00174 
00179 #define fix16Add(val1, val2)        ((val1) + (val2))
00180 
00184 #define fix16Sub(val1, val2)        ((val1) - (val2))
00185 
00189 #define fix16Neg(value)             (0 - (value))
00190 
00195 #define fix16Mul(val1, val2)        (((val1) * (val2)) >> FIX16_FRAC_BITS)
00196 
00200 #define fix16Div(val1, val2)        (((val1) << FIX16_FRAC_BITS) / (val2))
00201 
00202 
00203 #if (MATH_BIG_TABLES != 0)
00204 
00209 #define fix16Log2(v)                log2tab16[v]
00210 
00214 #define fix16Log10(v)               log10tab16[v]
00215 
00219 #define fix16Sqrt(v)                sqrttab16[v]
00220 
00221 #endif
00222 
00223 
00228 #define fix32ToFix16(value)         (((value) << FIX16_FRAC_BITS) >> FIX32_FRAC_BITS)
00229 
00233 #define fix16ToFix32(value)         (((value) << FIX32_FRAC_BITS) >> FIX16_FRAC_BITS)
00234 
00240 #define sinFix32(value)             sintab32[(value) & 1023]
00241 
00246 #define cosFix32(value)             sintab32[((value) + 256) & 1023]
00247 
00253 #define sinFix16(value)             sintab16[(value) & 1023]
00254 
00259 #define cosFix16(value)             sintab16[((value) + 256) & 1023]
00260 
00261 
00262 // 2D STUFF
00263 
00268 typedef struct
00269 {
00270     u16 x;
00271     u16 y;
00272 } Vect2D_u16;
00273 
00278 typedef struct
00279 {
00280     s16 x;
00281     s16 y;
00282 } Vect2D_s16;
00283 
00288 typedef struct
00289 {
00290     u32 x;
00291     u32 y;
00292 } Vect2D_u32;
00293 
00298 typedef struct
00299 {
00300     s32 x;
00301     s32 y;
00302 } Vect2D_s32;
00303 
00308 typedef struct
00309 {
00310     fix16 x;
00311     fix16 y;
00312 } Vect2D_f16;
00313 
00319 typedef struct
00320 {
00321         Vect2D_f16 a;
00322         Vect2D_f16 b;
00323 } Mat2D_f16;
00324 
00325 
00326 // 3D STUFF
00327 
00332 typedef struct
00333 {
00334     fix16 x;
00335     fix16 y;
00336     fix16 z;
00337 } Vect3D_f16;
00338 
00344 typedef struct
00345 {
00346         Vect3D_f16 a;
00347         Vect3D_f16 b;
00348         Vect3D_f16 c;
00349 } Mat3D_f16;
00350 
00351 
00352 // 4D STUFF
00353 
00358 typedef struct
00359 {
00360     fix16 x;
00361     fix16 y;
00362     fix16 z;
00363     fix16 w;
00364 } Vect4D_f16;
00365 
00371 typedef struct
00372 {
00373         Vect4D_f16 a;
00374         Vect4D_f16 b;
00375         Vect4D_f16 c;
00376         Vect4D_f16 d;
00377 } Mat4D_f16;
00378 
00379 
00380 
00385 u16 random();
00386 
00394 u32 intToBCD(u32 value);
00395 
00406 u32 distance_approx(s32 dx, s32 dy);
00407 
00408 
00420 void QSort_u8(u8 *data, u16 left, u16 right);
00432 void QSort_s8(s8 *data, u16 left, u16 right);
00444 void QSort_u16(u16 *data, u16 left, u16 right);
00456 void QSort_s16(s16 *data, u16 left, u16 right);
00468 void QSort_u32(u32 *data, u16 left, u16 right);
00480 void QSort_s32(s32 *data, u16 left, u16 right);
00481 
00482 
00483 #endif // _MATHS_H_
 All Classes Files Functions Variables Typedefs Enumerations Defines